/**
 * @file temps.h
 * @brief Fichier d'entête du module temps.
 *
 * @author Delory Rachid, Keita Mamadou, Florian Bernard
 */
#ifndef H_TIME_H
#define H_TIME_H

/* *********************************************************************                                                       
                   Librairies de Temps                                  
 ********************************************************************* */
#include <stdio.h>
#include <stdlib.h>

/* *********************************************************************                                         
                        Définitions de types                                                           
 ********************************************************************* */

/**
 * @struct sTemps
 * @brief Structure utilisée pour la gestion des temps.
 *
 * Cette structure est utilisée pour gérer une temps.
 Les champs de cette structures doivent être modifiés ou lus
 par les accesseurs et mutateurs.
 */

struct sTemps {
  unsigned int id;
  unsigned char heure; /** Heure */
  unsigned char minute; /** Minute */
  unsigned char seconde; /** Seconde */
  char maj;
  char sup;
} ;

/**
 * @typedef Temps
 * @brief Redéfinit la structure sTemps
 */
typedef struct sTemps Temps ;
/* *********************************************************************
         	 Fonction de la structure Temps                               
********************************************************************* */

/**
 * @fn Temps * creer_Tem() ;
 * @brief Crée un temps dans le tas
 *
 * @return un pointeur sur Temps
 */
Temps * creer_Tem();

/**
 * @fn void init_Tem(Temps * temps);
 * @brief Initilise un temps
 *
 * @param[in,out] Temps pointeur sur Temps
 */
void init_Tem(Temps * temps);

/**
 * @fn void liberer_Tem(Temps * temps);
 * @brief Libère le temps
 *
 * @param[in,out] temps pointeur sur Temps
 */
void liberer_Tem(Temps * temps);

/**
 * @fn void detruire_Tem(Temps ** temps);
 * @brief Détruis un temps du tas
 * 
 * @param[in,out] temps pointeur sur Temps
 */
void detruire_Tem(Temps ** temps);

/**
 * @fn void cpy_Tem(Temps * tempsDest, const Temps * tempsSrc);
 * @brief Copie dans tempsDest le tempsSrc
 * 
 * @param[in,out] tempsDest pointeur sur Temps
 * @param tempsSrc le temps que l'on veut copier
 */
void copier_Tem(Temps ** tempsDest, const Temps * tempsSrc);


/* *********************************************************************                                                             
           Accesseurs et Mutateurs de la structure Temps                                                                      
 ********************************************************************* */

/**
 * @fn unsigned char getId_Tem(const Temps *temps) ;
 * @brief récupère l'id de temps
 *
 * @param temps 
 * @return l'id du temps
 */
unsigned char getId_Tem(const Temps *temps) ;

/**
 * @fn unsigned char setId_Tem(Temps *temps, unsigned char id) ;
 * @brief initialise l'id du temps
 *
 * @param[in, out] temps temps à modifier
 * @param id
 */
void setId_Tem(Temps *temps, const unsigned char id) ;

/**
 * @fn unsigned char getHeure_Tem(const Temps *temps) ;
 * @brief récupère l'heure de temps
 *
 * @param temps 
 * @return l'heure du temps
 */
unsigned char getHeure_Tem(const Temps *temps) ;

/**
 * @fn unsigned char setHeure_Tem(Temps *temps, unsigned char heure) ;
 * @brief initialise l'heure du temps
 *
 * @param[in, out] temps temps à modifier
 * @param heure
 */
void setHeure_Tem(Temps *temps, const unsigned char heure) ;


/**
 * @fn unsigned char getMinute_Tem(const Temps *temps) ;
 * @brief récupère les minutes de temps
 *
 * @param temps 
 * @return les minutes de temps
 */
unsigned char getMinute_Tem(const Temps *temps) ;

/**
 * @fn unsigned char setMinute_Tem(Temps *temps, unsigned char minute) ;
 * @brief initialise la minute de temps
 *
 * @param[in, out] temps temps à modifier
 * @param minute
 */
void setMinute_Tem(Temps *temps, const unsigned char minute) ;

/**
 * @fn unsigned char getSeconde_Tem(const Temps *temps) ;
 * @brief récupère la seconde de temps
 *
 * @param temps 
 * @return seconde
 */
unsigned char getSeconde_Tem(const Temps *temps) ;

/**
 * @fn unsigned char setSeconde_Tem(Temps *temps, unsigned char seconde) ;
 * @brief initialise le temps
 *
 * @param[in, out] temps temps à modifier
 * @param seconde
 */
void setSeconde_Tem(Temps *temps, const unsigned char seconde) ;

/**
 * @fn int getTemps_Tem(Temps *temps) ;
 * @brief retourne le temps en seconde
 *
 * @param temps
 * @return le temps en seconde
 */
int getTemps_Tem(Temps *temps);

/**
 * @fn void setTemps_Tem(Temps *temps, const int minutes);
 * @brief Initialise le temps grâce à des minutes
 *
 * @param[in,out] temps
 * @param minutes 
 */
void setTemps_Tem(Temps *temps, const int minutes);

/**
 * @fn void setMaj_Tem(Temps *ptr, const char b);
 * @brief Set le besoin de faire une mise à jour, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setMaj_Tem(Temps *ptr, const char b);

/**
 * @fn char getMaj_Tem(const Temps *ptr);
 * @brief Retourne 0 si pas besoin de faire la mise à jour, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getMaj_Tem(const Temps *ptr);

/**
 * @fn void setSup_Tem(Temps *ptr, const char b);
 * @brief Set le besoin de le supprimer, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setSup_Tem(Temps *ptr, const char b);

/**
 * @fn char getSup_Tem(const Temps *ptr);
 * @brief Retourne 0 si pas besoin de le supprimer, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getSup_Tem(const Temps *ptr);

/**
 * @fn void regression_Tem() ;
 * @brief Test le module Temps
 */
void regression_Tem();
#endif
